package com.zpark.se.io.input;

import java.io.*;

/**
 * 字节输入流：InputStream
 *  	InputStream 是 Java 所有字节输入流类的父类，OutputStream 是 Java 所有字节
 * 	输出流类的父类，它们都是一个抽象类，因此继承它们的子类要重新定义父类中的抽象方法。
 *
 *  	下面首先介绍上述两个父类提供的常用方法，然后介绍如何使用它们的子类输入和输出字节流，
 *	包括 ByteArrayInputStream 类、ByteArrayOutputStream 类、FileInputStream 类
 *	和 FileOutputStream 类。
 */
public class Demo01 {
    public static void main(String[] args) {
        // 声明文件的路径
        String path = "src/com/zpark/se/io/input/f/a.txt";
        // 创建文件字节输入流
        InputStream in = null;
        try {
            /*
                创建FileInputStream对象常用的构造方法：
                    1、new FileInputStream(String name); 指定文件所在的路径+文件名字
                    2、new FileInputStream(File file); 传入一个File对象

                注意：如果文件不存在，则会抛出FileNotFoundException
             */
            // in = new FileInputStream(path);
            // 创建文件对象
            File f = new File(path);
            // 判断文案是否存在
            if (!f.exists()) {
                // 文件不存在，创建文件
                f.createNewFile();
            }
            // 创建文件字节输入流对象
            in = new FileInputStream(f);

            /*
                available()：返回文件字节输入流中剩余的字节数，即：文件大小
             */
            int available = in.available();

            /*
                mark(int readlimit)：标记当前位置，参数为：最多可以读取的字节数，
             */
            in.mark(10);

            /*
                markSupported()：
                判断当前文件字节输入流是否支持mark()方法，返回true表示支持，
                返回false表示不支持
             */
            boolean b = in.markSupported();

            /*
                read()：从输入流中读取一个字节，返回一个int值，如果返回-1，则表示已经读完
             */
            int read = in.read();

            /*
                read(byte[] b)：从输入流中读取字节数组，返回读取的字节数，
                如果返回-1，则表示已经读完
             */
            int read1 = in.read(new byte[8]);

            /*
                read(byte[] b, int off, int len)：从输入流中读取字节数组，
                返回读取的字节数，参数：
                    B——数据被读入的缓冲区。
                    Off -在数组b中开始写入数据的偏移量。
                    Len -要读取的最大字节数。
             */
            int read2 = in.read(new byte[8], 0, 8);

            /*
                reset()：将输入流重新定位到上次调用mark()方法时，记录的位置，
                即：上次调用mark()方法时，
             */
            in.reset();

            /*
                skip(long n)：跳过n个字节，返回实际跳过的字节数，如果返回-1，则表示已经读完
             */
            long skip = in.skip(10);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭文件流
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
